#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

//echo "file1 file2 file3" | ./xarg1 ls -l
//cat file_list.txt | ./xarg1 rm

void run(char* program, char** args) {
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        execvp(program, args);
        // 如果execvp返回，说明发生了错误
        perror("execvp");
        exit(1);
    } else if (pid < 0) {
        // fork失败
        perror("fork");
    }
    // 父进程继续
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "用法: %s 命令 [参数...]\n", argv[0]);
        exit(1);
    }

    char buf[512];
    char* p = buf, * last_p = buf;
    char* argsbuf[128];
    char** args = argsbuf;

    // 复制xargs参数到argsbuf
    for (int i = 1; i < argc; i++) {
        *args++ = argv[i];
    }

    char** pa = args;  // 存储当前参数位置

    // 从标准输入读取数据
    int c;
    while ((c = getchar()) != EOF) {
        *p = c;
        if (*p == ' ' || *p == '\n') {
            *p = '\0';
            if (p > last_p) { // 只添加非空参数
                *(pa++) = last_p;
            }
            last_p = p + 1;

            if (c == '\n') {
                *pa = 0;  // 参数列表以空指针结束
                run(argv[1], argsbuf);
                pa = args;  // 为下一条命令重置
            }
        }
        p++;
        // 防止缓冲区溢出
        if (p - buf >= sizeof(buf) - 1) {
            fprintf(stderr, "错误: 输入行太长\n");
            exit(1);
        }
    }

    // 处理不以换行符结束的最后一组参数
    if (pa != args) {
        *p = '\0';
        if (p > last_p) { // 只添加非空参数
            *(pa++) = last_p;
        }
        *pa = 0;
        run(argv[1], argsbuf);
    }

    // 等待所有子进程
    int status;
    while (wait(&status) > 0);

    return 0;
}